﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;

namespace Cotizav.AccesoDatos
{
    public class ClienteDAO
    {
        public List<Entidades.Cliente> Listar(Util.ContextoDB ctx)
        {
            SqlCommand cmd = new SqlCommand("select * from CLIENTE", ctx.GetConexion(), ctx.GetTx());
            DataTable dtClientes = new DataTable();
            dtClientes.Load(cmd.ExecuteReader());

            List<Entidades.Cliente> lista = new List<Entidades.Cliente>();

            foreach (DataRow fila in dtClientes.Rows)
            {
                Entidades.Cliente c = new Entidades.Cliente();

                c.IdCliente = Int32.Parse(fila["ID"].ToString());
                c.Direccion = fila["DIRECCION"].ToString();
                c.Provincia = fila["PROVINCIA"].ToString();
                c.Email = fila["EMAIL"].ToString();
                c.RazonSocial = fila["RAZONSOCIAL"].ToString();
                c.IdCategoria = !(fila["IDCATEGORIA"] is DBNull) ? Int32.Parse(fila["IDCATEGORIA"].ToString()) : new Nullable<int>();
                c.IdSector = !(fila["IDSECTOR"] is DBNull) ? Int32.Parse(fila["IDSECTOR"].ToString()) : new Nullable<int>();
                c.IdDistrito = !(fila["IDDISTRITO"] is DBNull) ? Int32.Parse(fila["IDDISTRITO"].ToString()) : new Nullable<int>();
                c.IdSucursal = !(fila["IDSUCURSAL"] is DBNull) ? Int32.Parse(fila["IDSUCURSAL"].ToString()) : new Nullable<int>();
                c.RucCliente = fila["CLIENTERUC"].ToString();
                c.Telefono = fila["TELEFONO"].ToString();
                c.Activo = Int32.Parse(fila["ACTIVO"].ToString());
                c.IdVendedor =!(fila["IDVENDEDOR"] is DBNull) ? Int32.Parse(fila["IDVENDEDOR"].ToString()) : new Nullable<int>();
                c.FechaRegistro = !(fila["FECHAREGISTRO"] is DBNull) ? Convert.ToDateTime(fila["FECHAREGISTRO"].ToString()) : new Nullable<DateTime>();
                c.FechaModificacion = !(fila["FECHAMODIFICACION"] is DBNull) ? Convert.ToDateTime(fila["FECHAMODIFICACION"].ToString()) : new Nullable<DateTime>();
                c.UsuarioRegistro = fila["USUARIOREGISTRO"].ToString();
                c.UsuarioModificacion = fila["USUARIOMODIFICACION"].ToString();

                lista.Add(c);
            }

            return lista;
        }

        public List<Entidades.Cliente> ListarCliente(Util.ContextoDB ctx, Entidades.Cliente cliente)
        {
            SqlCommand cmd = new SqlCommand(string.Format("select * from CLIENTE where id = {0}", cliente.IdCliente.ToString()), ctx.GetConexion(), ctx.GetTx());
            DataTable dtClientes = new DataTable();
            dtClientes.Load(cmd.ExecuteReader());

            List<Entidades.Cliente> lista = new List<Entidades.Cliente>();

            foreach (DataRow fila in dtClientes.Rows)
            {
                Entidades.Cliente c = new Entidades.Cliente();

                c.IdCliente = Int32.Parse(fila["ID"].ToString());
                c.Direccion = fila["DIRECCION"].ToString();
                c.Provincia = fila["PROVINCIA"].ToString();
                c.Email = fila["EMAIL"].ToString();
                c.RazonSocial = fila["RAZONSOCIAL"].ToString();
                c.IdCategoria = !(fila["IDCATEGORIA"] is DBNull) ? Int32.Parse(fila["IDCATEGORIA"].ToString()) : new Nullable<int>();
                c.IdSector = !(fila["IDSECTOR"] is DBNull) ? Int32.Parse(fila["IDSECTOR"].ToString()) : new Nullable<int>();
                c.IdDistrito = !(fila["IDDISTRITO"] is DBNull) ? Int32.Parse(fila["IDDISTRITO"].ToString()) : new Nullable<int>();
                c.IdSucursal = !(fila["IDSUCURSAL"] is DBNull) ? Int32.Parse(fila["IDSUCURSAL"].ToString()) : new Nullable<int>();
                c.RucCliente = fila["CLIENTERUC"].ToString();
                c.Telefono = fila["TELEFONO"].ToString();
                c.Activo = Int32.Parse(fila["ACTIVO"].ToString());
                c.IdVendedor = !(fila["IDVENDEDOR"] is DBNull) ? Int32.Parse(fila["IDVENDEDOR"].ToString()) : new Nullable<int>();
                c.FechaRegistro = !(fila["FECHAREGISTRO"] is DBNull) ? Convert.ToDateTime(fila["FECHAREGISTRO"].ToString()) : new Nullable<DateTime>();
                c.FechaModificacion = !(fila["FECHAMODIFICACION"] is DBNull) ? Convert.ToDateTime(fila["FECHAMODIFICACION"].ToString()) : new Nullable<DateTime>();
                c.UsuarioRegistro = fila["USUARIOREGISTRO"].ToString();
                c.UsuarioModificacion = fila["USUARIOMODIFICACION"].ToString();

                lista.Add(c);
            }

            return lista;
        }

        public int Registrar(Util.ContextoDB ctx, Entidades.Cliente cliente)
        {
            SqlCommand cmd = new SqlCommand("USP_CLIENTE_INSERT", ctx.GetConexion(), ctx.GetTx());
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@ID", 0).Direction = System.Data.ParameterDirection.Output;
            cmd.Parameters.AddWithValue("@DIRECCION", cliente.Direccion ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@PROVINCIA", cliente.Provincia ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@EMAIL", cliente.Email ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@RAZONSOCIAL", cliente.RazonSocial ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IDCATEGORIA", cliente.IdCategoria.HasValue ? cliente.IdCategoria.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IDSECTOR", cliente.IdSector.HasValue ? cliente.IdSector.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IDDISTRITO", cliente.IdDistrito.HasValue ? cliente.IdDistrito.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IDSUCURSAL", cliente.IdSucursal.HasValue ? cliente.IdSucursal.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@CLIENTERUC", cliente.RucCliente ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@TELEFONO", cliente.Telefono ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@ACTIVO", cliente.Activo);
            cmd.Parameters.AddWithValue("@IDVENDEDOR", cliente.IdVendedor.HasValue ? cliente.IdVendedor.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@FECHAREGISTRO", cliente.FechaRegistro.HasValue ? cliente.FechaRegistro.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@USUARIOREGISTRO", cliente.UsuarioRegistro ?? (object)DBNull.Value);

            int resultado = cmd.ExecuteNonQuery();

            int id = Int32.Parse(cmd.Parameters["@ID"].Value.ToString());
            cliente.IdCliente = id;

            return resultado;
        }

        public int Actualizar(Util.ContextoDB ctx, Entidades.Cliente updCliente)
        {
            SqlCommand cmd = new SqlCommand("USP_CLIENTE_UPDATE", ctx.GetConexion(), ctx.GetTx());
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@ID", updCliente.IdCliente);
            cmd.Parameters.AddWithValue("@DIRECCION", updCliente.Direccion ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@PROVINCIA", updCliente.Provincia ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@EMAIL", updCliente.Email ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@RAZONSOCIAL", updCliente.RazonSocial ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IDCATEGORIA", updCliente.IdCategoria.HasValue ? updCliente.IdCategoria.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IDSECTOR", updCliente.IdSector.HasValue ? updCliente.IdSector.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IDDISTRITO", updCliente.IdDistrito.HasValue ? updCliente.IdDistrito.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@IDSUCURSAL", updCliente.IdSucursal.HasValue ? updCliente.IdSucursal.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@CLIENTERUC", updCliente.RucCliente ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@TELEFONO", updCliente.Telefono ?? (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@ACTIVO", updCliente.Activo);
            cmd.Parameters.AddWithValue("@IDVENDEDOR", updCliente.IdVendedor.HasValue ? updCliente.IdVendedor.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@FECHAMODIFICACION", updCliente.FechaModificacion.HasValue ? updCliente.FechaModificacion.Value : (object)DBNull.Value);
            cmd.Parameters.AddWithValue("@USUARIOMODIFICACION", updCliente.UsuarioModificacion ?? (object)DBNull.Value);

            int result = cmd.ExecuteNonQuery();

            return result;
        }

        public int Eliminar(Util.ContextoDB ctx, Entidades.Cliente selectedCliente)
        {
            SqlCommand cmd = new SqlCommand("USP_CLIENTE_DELETE", ctx.GetConexion(), ctx.GetTx());
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@ID", selectedCliente.IdCliente);

            int result = cmd.ExecuteNonQuery();

            return result;
        }
    }
}
